/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKDocumentoSerieReporte;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.to.ReporteDocumentoTO;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Scope("request")
@Named(value = "MBDocumentoSerieReporte")
public class MBDocumentoSerieReporte extends MBGenerico implements Serializable {

    @Inject
    private BKDocumentoSerieReporte bk;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private IServicioVentaFacturacion servicioVenta;
    @Inject
    private IServicioGuiaRemision servicioGuia;
    @Inject
    private IServicioOrdenPedido servicioOP;
    @Autowired
    BKSession session;

    public String mostrarDocumentoGuia() {

        bk.setListaDocumentos(null);
        bk.setSerie("");
        try {
            bk.setListaSeries(servicioCorrelativo.obtenerSeriePorDoc(TIPO_DOC_VENTA.GUIA.getValor(), session.getEmpresa().getId()));
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        return URLPaginacion.ReporteDocumentos.DOCUMENTO_GUIA;
    }

    public void buscarGuias() {

        bk.setListaDocumentos(new ArrayList<ReporteDocumentoTO>());

        VentaFacturacion guiaVenta = new VentaFacturacion();
        guiaVenta.setTipoCompago(TIPO_DOC_VENTA.GUIA.getValor());


        GuiaRemision guia = new GuiaRemision();
        guia.setTipoCompPago(TIPO_DOC_VENTA.GUIA.getValor());
        guia.setIdEmpresa(session.getEmpresa());

        Collection<String> seriesBusqueda = new ArrayList<String>();
        if (bk.getSerie().equalsIgnoreCase("")) {
            seriesBusqueda = bk.getListaSeries();

        } else {
            seriesBusqueda.add(bk.getSerie());
        }


        for (String serie : seriesBusqueda) {
            List<ReporteDocumentoTO> lista = new ArrayList<ReporteDocumentoTO>();

            guiaVenta.setSerieFactura(serie);
            guia.setSerie(serie);

            try {
                lista.addAll(listarDocumentosGuia(servicioGuia.obtenerGuiasPorSerie(guia, bk.getFechaInicio(), bk.getFechaFinal())));

                lista.addAll(listarDocumentosVenta(servicioVenta.obtenerGuiasPorSerie(guiaVenta, bk.getFechaInicio(), bk.getFechaFinal(), session.getEmpresa().getId())));

            } catch (ServiceException e) {
                e.printStackTrace();
            }

            Collections.sort(lista, new Comparator() {
                public int compare(Object o1, Object o2) {
                    ReporteDocumentoTO e1 = (ReporteDocumentoTO) o1;
                    ReporteDocumentoTO e2 = (ReporteDocumentoTO) o2;
                    int resultado = e1.getNumero().compareTo(e2.getNumero());

                    if (resultado != 0) {
                        return resultado;
                    }
                    resultado = e1.getNumero().compareTo(e2.getNumero());

                    if (resultado != 0) {
                        return resultado;
                    }
                    return resultado;
                }
            });

            bk.getListaDocumentos().addAll(lista);
        }




    }

    public List<ReporteDocumentoTO> listarDocumentosVenta(Collection<VentaFacturacion> listaGuiaVenta) {
        List<ReporteDocumentoTO> lista = new ArrayList<ReporteDocumentoTO>();
        for (VentaFacturacion venta : listaGuiaVenta) {
            ReporteDocumentoTO documento = new ReporteDocumentoTO();
            documento.setSerie(Integer.parseInt(venta.getSerieFactura()));
            documento.setNumero(Integer.parseInt(venta.getNumFactura()));
            documento.setFecha(venta.getFechDocventa());
            documento.setRemitido(venta.getRazon());
            //documento.setCodigoOP(venta.getOrdenPedido().getCodigoOrdenPedido());
            documento.setCodigoOP("");
            lista.add(documento);
        }
        return lista;
    }

    public List<ReporteDocumentoTO> listarDocumentosGuia(Collection<GuiaRemision> listaGuia) {
        List<ReporteDocumentoTO> lista = new ArrayList<ReporteDocumentoTO>();
        for (GuiaRemision guia : listaGuia) {
            ReporteDocumentoTO documento = new ReporteDocumentoTO();
            documento.setSerie(Integer.parseInt(guia.getSerie()));
            documento.setNumero(Integer.parseInt(guia.getNumeroGuia()));
            documento.setFecha(guia.getFechaEmision());
            documento.setRemitido(guia.getNombreDestinatario());
            //documento.setCodigoOP(venta.getOrdenPedido().getCodigoOrdenPedido());
            if (guia.getOrdenPedido() != null) {
                documento.setCodigoOP(guia.getOrdenPedido().getCodigoOrdenPedido());
            } else {
                documento.setCodigoOP("");
            }
            lista.add(documento);

        }
        return lista;
    }

    public void postProcessXLS(Object document) {
        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        
        
        sheet.setColumnWidth(0, 4500);
        sheet.setColumnWidth(1, 3000);
        sheet.setColumnWidth(2, 3500);
        sheet.setColumnWidth(3, 12000);
        sheet.setColumnWidth(4, 4500);
        
        
        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        
        HSSFFont cabFont = wb.createFont();
        cabFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.setFont(cabFont);
        
        sheet.setDefaultColumnStyle(0, cabStyle);
        sheet.setDefaultColumnStyle(1, cabStyle);
        sheet.setDefaultColumnStyle(2, cabStyle);
        sheet.setDefaultColumnStyle(3, cabStyle);
        sheet.setDefaultColumnStyle(4, cabStyle);
        
        
        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(HSSFColor.GREEN.index, (byte) 216, (byte) 228, (byte) 188);
        
        HSSFRow header = sheet.getRow(0);
        
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.cloneStyleFrom(borderStyle);
        cellStyle.setFillForegroundColor(HSSFColor.GREEN.index);
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        for (int i = 0; i < header.getPhysicalNumberOfCells(); i++) {
            HSSFCell cell = header.getCell(i);

            cell.setCellStyle(cellStyle);
        }


    }
}